package com.example.blog.service.impl;

import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.example.blog.entity.BlogType;
import com.example.blog.mapper.TypeMapper;
import com.example.blog.service.TypeService;

@Service
public class TypeServiceImpl implements TypeService {

    @Autowired
    private TypeMapper typeMapper;

    @Override
    public List<BlogType> getAllTypes() {
        return typeMapper.selectAll();
    }

    @Override
    public BlogType getTypeById(Integer typeId) {
        return typeMapper.selectByPrimaryKey(typeId);
    }

    @Override
    public List<BlogType> getTypesByUserId(Integer userId) {
        return typeMapper.selectByUserId(userId);
    }

    @Override
    @Transactional
    public BlogType createType(BlogType blogType) {
        // 检查类型名称是否已存在（按用户ID）
        if (typeMapper.checkTypeNameExists(blogType.getTypeName(), blogType.getUserId()) > 0) {
            throw new RuntimeException("该类型名称已存在");
        }

        // 设置创建时间和更新时间
        Date now = new Date();
        blogType.setCreateTime(now);
        blogType.setUpdateTime(now);
        blogType.setIsDeleted(0);

        // 插入新类型
        typeMapper.insert(blogType);
        return blogType;
    }

    @Override
    @Transactional
    public BlogType updateType(BlogType blogType) {
        // 检查类型是否存在
        BlogType existingType = typeMapper.selectByPrimaryKey(blogType.getTypeId());
        if (existingType == null) {
            throw new RuntimeException("类型不存在");
        }

        // 检查权限
        if (!existingType.getUserId().equals(blogType.getUserId())) {
            throw new RuntimeException("没有权限修改此类型");
        }

        // 如果修改了类型名称，检查新名称是否已存在
        if (!existingType.getTypeName().equals(blogType.getTypeName()) &&
            typeMapper.checkTypeNameExists(blogType.getTypeName(), blogType.getUserId()) > 0) {
            throw new RuntimeException("该类型名称已存在");
        }

        // 设置更新时间
        blogType.setUpdateTime(new Date());

        // 更新类型
        typeMapper.updateByPrimaryKey(blogType);
        return blogType;
    }

    @Override
    @Transactional
    public boolean deleteType(Integer typeId) {
        // 检查类型是否存在
        BlogType existingType = typeMapper.selectByPrimaryKey(typeId);
        if (existingType == null) {
            throw new RuntimeException("类型不存在");
        }

        // 检查类型是否被使用
        if (typeMapper.checkTypeInUse(typeId) > 0) {
            throw new RuntimeException("该类型正在被博客使用，无法删除");
        }

        // 软删除类型
        return typeMapper.deleteByPrimaryKey(typeId) > 0;
    }

    @Override
    public boolean isTypeNameExists(String typeName, Integer userId) {
        return typeMapper.checkTypeNameExists(typeName, userId) > 0;
    }
} 